package conservare.boleto;

import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import org.jrimum.texgit.FlatFile;
import org.jrimum.texgit.Record;
import org.jrimum.texgit.Texgit;


public abstract class LeitorDeArquivoRetorno {

	Record hd;
	Record hdLote;
	List<Record> dadosDosPagamentos = new ArrayList<>();
	
	
	protected abstract String getArquivoRetornoLayoutXml();
	
	
	public void defineConteudoArquivoRetorno(InputStream inputStream){
		
		FlatFile<Record> ff = Texgit.createFlatFile(getArquivoRetornoLayoutXml());
		
		ff.read(transformarArquivoByteEmLista(inputStream));
		
		hd = ff.getRecord("HeaderArquivo");
		hdLote = ff.getRecord("HeaderLote");
		dadosDosPagamentos = (List<Record>) ff.getRecords("Arrecadacao-Segmento-T");
		
	}
	
	public Integer getHeaderNumeroSequencialRetorno(){
		return  hdLote.getValue("Retorno-Numero");
	}
	
	public String getHeaderNumeroDoBanco(){
		return hd.getValue("CodigoBanco");
	}
	
	public String getHeaderNomeDoBanco(){
		return hd.getValue("NomeBanco");
	}
	
	public String getHeaderNomeDaEmpresa(){
		return hd.getValue("Empresa-Nome");
	}
	
	public Date getHeaderDataGeracaoArquivo(){
		return hd.getValue("Arquivo-GeracaoData");
	}
	
	public String getHeaderCnpjEmpresa(){
		return hd.getValue("Empresa-CPRF");
	}
	
	
	public int getQuatidadesDeLinhasDadosDoPagamento(){
		return this.dadosDosPagamentos.size();
	}
	
	
	public Date getPagamentoDetalheVencimentoDoTitulo(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Vencimento");
		
		
		return null;
					
	}
	
	
	public Date getPagamentoDetalheDataPagamentoDoTitulo(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);
				
		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Data-Ocorrencia");
		
		//return dadosDosPagamentos.get(index).getValue("Data-Efetivacao");
		//return dadosDosPagamentos.get(index).getValue("Data-Ocorrencia");
		
		return null;
	}

	public String getPagamentoDetalheNosoNumero(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		
		return dadosDosPagamentos.get(index).getValue("NossoNumero");
					
	}
	
	public BigDecimal getPagamentoDetalheValorAbatimento(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-Abatimento");
		
		
		return BigDecimal.ZERO;
		
	}
	
	public BigDecimal getPagamentoDetalheValorDesconto(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-Abatimento");
		
		
		return BigDecimal.ZERO;
				
				
	}

	public BigDecimal getPagamentoDetalheValorIOF(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-IOF");
		
		
		return BigDecimal.ZERO;
					
	}

	public BigDecimal getPagamentoDetalheValorLiquidoCreditado(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-LiquidoCreditado");
		
		
		return BigDecimal.ZERO;
					
	}

	public BigDecimal getPagamentoDetalheValorMultaEJuros(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-MultaJuros");
		
		
		return BigDecimal.ZERO;

		
	}

	public BigDecimal getPagamentoDetalheValorPago(int index){
		
		if(getQuatidadesDeLinhasDadosDoPagamento() == 0)
			return null;
		
		if(!isIndexOk(index))
			return null;
		
		// Arrecadacao-Segmento-U
		Record ru = dadosDosPagamentos.get(index).getInnerRecords().get(0);

		Integer movimento = ru.getValue("CodigoMovimento");

		if (movimento == 6)
			return ru.getValue("Valor-Pago");
		
		
		return BigDecimal.ZERO;
		
					
	}

	private boolean isIndexOk(int index){
		if(index < 0)
			return false;
					
		if(index > (getQuatidadesDeLinhasDadosDoPagamento() -1))
				return false;
		
		return true;
	}
	
/*	public Iterator<Record> getDadosDosPagamentos() {
		return dadosDosPagamentos.iterator();
	}*/


	private List<String> transformarArquivoByteEmLista(InputStream inputStream) {
		
		
		List<String> linhas = new ArrayList<>();
		Scanner scanner = new Scanner(inputStream);
		
		while(scanner.hasNextLine()){
			String linha = scanner.nextLine();
			
			if(!linha.trim().equals("")){
				linhas.add(linha);
			}
			
		}
		scanner.close();
		
		return linhas;
	}
	
	
	
	
	
}
